
import { createClient } from 'redis'

// -------------------------------
// 配置参数（优先级：环境变量 > 默认值）
// -------------------------------
const redisConfig = {
  // 连接配置
  socket: {
    host: process.env.REDIS_HOST || 'localhost',
    port: Number(process.env.REDIS_PORT) || 6379,
    // 生产环境启用 TLS 加密
    tls: process.env.NODE_ENV === 'production',
    // 连接超时（单位：毫秒）
    connectTimeout: 5000
  },

  // 认证信息
  password: process.env.REDIS_PASSWORD || undefined,

  // 连接策略
  pingInterval: 30000, // 保持连接活性（30秒心跳）
  disableOfflineQueue: true // 离线时拒绝操作
}

// -------------------------------
// 创建客户端实例
// -------------------------------
const redisClient = createClient(redisConfig)

// -------------------------------
// 连接事件监听
// -------------------------------
// 开发环境日志
if (process.env.NODE_ENV !== 'production') {
  redisClient.on('connect', () => console.log('✅ Redis 连接成功'))
  redisClient.on('reconnecting', () => console.log('🔄 Redis 重连中...'))
}

// 生产环境错误处理
redisClient.on('error', (err) => {
  console.error(`❌ Redis错误: ${err.code}`, err.message)

  // 生产环境关键错误退出
  if (process.env.NODE_ENV === 'production' && err.code === 'ECONNREFUSED') {
    process.exit(1) // Docker/K8s 环境下自动重启
  }
})

// -------------------------------
// 初始化连接（带超时控制）
// -------------------------------
const initRedis = async () => {
  try {
    await Promise.race([
      redisClient.connect(),
      new Promise((_, reject) =>
        setTimeout(() => reject(new Error('连接超时')), 6000)
      )
    ])
  } catch (err) {
    console.error('Redis初始化失败:', err.message)
    if (process.env.NODE_ENV === 'production') throw err
  }
}

// 非测试环境自动连接
if (process.env.NODE_ENV !== 'test') {
  initRedis()
}

// -------------------------------
// 优雅关闭
// -------------------------------
process.on('SIGINT', async () => {
  await redisClient.quit()
  console.log('Redis连接已关闭')
})

// -------------------------------
// 导出实例
// -------------------------------
export default redisClient